DockerとDocker SDKを触る
話したいこと
Dockerfileの書き方
Dockerイメージ, Dockerコンテナのでき方
Docker SDKの紹介
Dockerのふんわりとしたイメージ
プログラムの実行環境を作れる (Dockerfile, docker build)
作った環境を実行できる (docker run)
作った環境を共有できる (Docker registory)
Docker とは開発者やシステム管理者が、コンテナでアプリケーションを **構築(build)、実行(run)、共有(share)**するためのプラットフォームです。アプリケーションをデプロイするために、コンテナを利用する事をコンテナ化( containerization )と呼びます。
Dockerの基本的な使い方
Dockerfileを書く
Dockerfileをビルドする docker build -> Docker イメージができる
Dockerイメージを実行する docker run -> Dockerコンテナが動く
code:Dockerfile
# 元となるDockerイメージ
FROM ubuntu:20.04
# 使うものの準備 コードのコピーとか
RUN touch hoge.txt
# アプリケーションの実行 サーバーアプリケーションとか
code:sh
docker build . -t myapp
docker run --name run-myapp myapp
Dockerfileの書き方例
FROM
作成するDockerイメージの元となるイメージを指定する
LABEL
Dockerイメージにメタデータを追加する
COPY
ファイルやディレクトリをコピーする
RUN
イメージ内でコマンドを実行する
CMD
コンテナ実行時の処理を設定する
最後の一つしか処理されない
WORKDIR
ワークディレクトリを設定する
Dockerfileを書く上での推奨とされることがまとめられている
ビルド時にキャッシュをうまく使う書き方
お作法
どういう中身なのか
Dockerイメージ
レイヤはデータや命令の情報を持っている
レイヤがまとまっている
Dockerfileで命令を追加するとレイヤが増える
http://docs.docker.jp/v1.9/_images/image-layers.png
Dockerコンテナ
Dockerイメージに書き込み可能なレイヤが追加される
コンテナ内でのファイル書き込みや操作はコンテナ・レイヤに保存される
あるコンテナでの操作はそのコンテナ・レイヤ以外に影響しないので同じイメージを共有できる
http://docs.docker.jp/v1.9/_images/container-layers.png
基本的にコンテナは何もしない(指定したプロセスが動いている)
我々がDockerfileなどでコマンドを指定してコンテナ上でアプリケーションを動かす
コンテナは自分自身のファイルシステム(Dockerイメージ)に含まれるコードやバイナリにアクセスできる
Docker Engine
http://docs.docker.jp/v1.12/_images/engine-components-flow.png
http://docs.docker.jp/v1.12/_images/architecture.png
unix:///var/run/docker.sock
curl --unix-socket /var/run/docker.sock http:/v1.24/images/json
Docker SDK for Python
pythonでイメージ取得
コンテナ実行
Docker SDKで何が作れる
dockerを操作するオレオレアプリを作る(?)
ユーザーから入力されたコードをコンテナに投げて実行結果の成否判定とかすると競技プログラミングのジャッジシステムが作れます
あまり思いつかない
最後
DockerイメージとDockerコンテナは命令やデータを保存したレイヤのまとまり
Docker SDKを使うとプログラムからDockerを操作できて楽しい(?)
Docker SDKを使ってDockerを扱いたい場面がフロントエンドにあるのかな...
面白い技術だと思うので触ってみてもらえたらなと思います
気ままに書いている間に公開されていたとても詳しい記事です